**************************************************************************************
	;Header frs File-linken

	IFD	Flag_project
Flag_UnderPara	set 1
	ENDC
	IFND	Flag_UnderPara
Flag_UnderPara	set 0
	ENDC
	IFEQ	Flag_UnderPara
Flag_UnderPara	set 1
	include	Nutz_project
	ELSEIF
**************************************************************************************

		rsset	Task_Buffer
Under_CopperList1	rs.b	17*6
Under_CopperList2	rs.b	17*6
UCopper_Buffer		rs.l	1
UCopper_Help		rs.b	6
UCopper_TabPointer	rs.l	1
UYPos_Pointer		rs.l	1
UYPos_Buffer		rs.l	1
UYPos_Table1		rs.w	42
UYPos_Table2		rs.w	42
ULax_Variables		rs.b	16*LAX_ENTRYLENGTH
UBack_XPos		rs.w	1
UBack_YPos0		rs.w	1
UBack_SplitPos1		rs.w	1
UBack_YPos1		rs.w	1
UBack_SplitPos2		rs.w	1
UBack_YPos2		rs.w	1
UWood_SplitPos		rs.w	1
UWood_SplitPos2		rs.w	1
UWood_YPos		rs.w	1
UWood_XPos		rs.w	1
UWood_Height		rs.w	1
UVBL_Handler		rs.l	1
USplit_table		rs.b	8*8
UFade_Struktur		rs.b	FADE_SIZEOF+64*6

Fog_XPos1		rs.w	1
Fog_YPos1		rs.w	1
Fog_XPos2		rs.w	1
Fog_YPos2		rs.w	1

Fog_Float		rs.w	4
Fog_global_verz		rs.b	1
Fog_next_anim		rs.b	1

Fog_Pointer		rs.w	1


MakeUnderPara:
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
;	Hinterste Ebene berechnen
	tst.b	Dont_render_Parallax(a6)
	bne	.only_colors

	moveq	#0,d0
	move.w	Scr_Y_Level_Pos(a6),d0
	lsr.w	#2,d0
	divu	#160,d0
	swap	d0				;Y-Pos der hintersten Ebene (0-159)

	moveq	#0,d1
	move.w	Scr_X_Level_Pos(a6),d1
	lsr.w	#2,d1
	neg.w	d1
	divu	#160,d1
	swap	d1
	add.w	#320+32,d1			;X-Pos der hintersten Ebene (0-159)

	move.w	d1,UBack_XPos(a6)
	move.w	d0,UBack_YPos0(a6)

	move.w	#160,d2
	sub.w	d0,d2				;Hier muss der 1. Split sein.
	bne.s	.set_split1
	add.w	#160,d2
.set_split1:
	move.w	d2,UBack_SplitPos1(a6)
	move.w	d2,d3
	neg.w	d3
	move.w	d3,UBack_YPos1(a6)

	add.w	#160,d2				;Hier muss der 2. Split sein.
	cmp.w	#223,d2
	bhi.s	.no_split2

	move.w	d2,UBack_SplitPos2(a6)
	move.w	d2,d3
	neg.w	d3
	move.w	d3,UBack_YPos2(a6)
	bra.s	.split2_done
.no_split2:
	move.w	#$ffff,UBack_SplitPos2(a6)
.split2_done:

;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
;	Holzbalken parallaxen

	move.w	#160,d1

	moveq	#0,d0
	move.w	Scr_X_Level_Pos(a6),d0
	lsr.w	#1,d0
	divu	#320,d0
	swap	d0
	neg.w	d0
	and.w	#511,d0
	beq.s	.ok
	cmp.w	#352,d0
	bhi.s	.ok
	add.w	#160,d0
	add.w	#48,d1
.ok:
	move.w	d0,UWood_XPos(a6)
	move.w	#48,UWood_Height(a6)

	moveq	#0,d0
	move.w	Scr_Y_Level_Pos(a6),d0
	lsr.w	#1,d0
	divu	#272,d0
	swap	d0
	neg.w	d0
	add.w	#271,d0

	cmp.w	#224,d0
	bhi.s	.wrap_ok
	cmp.w	#88,d0
	blo.s	.wrap_ok
	sub.w	#136,d0
	bpl.s	.wrap_ok
	add.w	#272,d0
.wrap_ok:
	move.w	d0,UWood_SplitPos2(a6)
	cmp.w	#88,d0
	bge.s	.wrap_ok2
	add.w	#136,UWood_SplitPos2(a6)
.wrap_ok2:
	cmp.w	#224,d0
	blo.s	.on_screen

	move.w	d0,UWood_Height(a6)
	sub.w	#224,UWood_Height(a6)

	clr.w	UWood_SplitPos(a6)
	bra.s	.not_on_screen
.on_screen:
	move.w	d0,UWood_SplitPos(a6)
.not_on_screen:
	move.w	d1,UWood_YPos(a6)

	cmp.w	#224,UWood_SplitPos2(a6)
	blo.s	.wood_ok1
	sub.w	#136,UWood_SplitPos2(a6)
.wood_ok1:

;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
;	Splits in die Tabelle eintragen!


	lea	USplit_table(a6),a0

	move.w	UBack_SplitPos1(a6),(a0)+	;Niedrigste Split-Prioritt
	move.w	UBack_YPos1(a6),(a0)+
	move.w	UBack_XPos(a6),(a0)+
	move.w	#Copper_UnderSplit,(a0)+

	move.w	UBack_SplitPos2(a6),(a0)+
	move.w	UBack_YPos2(a6),(a0)+
	move.w	UBack_XPos(a6),(a0)+
	move.w	#Copper_UnderSplit,(a0)+

	move.w	#$ffff,(a0)
	move.l	a0,a5				;Ende der Tabelle.

;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
;	Feststellen, ob im Holzbalken ein anderer Split liegt!

	move.w	UWood_SplitPos(a6),d0
	move.w	d0,d1
	add.w	UWood_Height(a6),d1

	lea	USplit_table(a6),a0
	moveq	#2-1,d7
.wood_loop:
	cmp.w	(a0),d0
	bgt.s	.wood_next
	beq.s	.wood_end
	cmp.w	(a0),d1
	blt.s	.wood_end

	;Dieser Split muss weg!

	bsr	.delete_split

	bra.s	.wood_end
.wood_next:
	addq.l	#8,a0
	dbf	d7,.wood_loop

.wood_end:

;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
;	Holzbalken einsortieren.

	move.w	UWood_SplitPos(a6),d0
	move.w	UWood_YPos(a6),d1
	sub.w	d0,d1
	move.w	UWood_XPos(a6),d2
	move.w	#Copper_UnderSplit,d3
	bsr	.insert_split

;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
;	Ende des Holzbalkens einsortieren.

	move.w	UWood_SplitPos(a6),d0
	add.w	UWood_Height(a6),d0

	move.w	UBack_YPos0(a6),d1
	add.w	d0,d1
	cmp.w	#320,d1
	blt.s	.ok1
	sub.w	#160,d1
.ok1:
	cmp.w	#160,d1
	blt.s	.ok2
	sub.w	#160,d1
.ok2:
	sub.w	d0,d1

	move.w	UBack_XPos(a6),d2
	move.w	#Copper_UnderSplit,d3
	bsr	.insert_split

;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
;	Feststellen, ob im 2.Holzbalken ein anderer Split liegt!

	move.w	UWood_SplitPos2(a6),d0
	move.w	d0,d1
	add.w	#48,d1

	lea	USplit_table(a6),a0
	moveq	#4-1,d7
.wood_loop2:
	cmp.w	(a0),d0
	bgt.s	.wood_next2
	beq.s	.wood_end2
	cmp.w	(a0),d1
	blt.s	.wood_end2

	;Dieser Split muss weg!

	bsr	.delete_split

	bra.s	.wood_end2
.wood_next2:
	addq.l	#8,a0
	dbf	d7,.wood_loop2

.wood_end2:

;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
;	2. Holzbalken einsortieren.

	move.w	UWood_SplitPos2(a6),d0
	move.w	UWood_YPos(a6),d1
	sub.w	d0,d1
	move.w	UWood_XPos(a6),d2
	move.w	#Copper_UnderSplit,d3
	bsr	.insert_split

;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
;	2. Ende des Holzbalkens einsortieren.

	move.w	UWood_SplitPos2(a6),d0
	add.w	#48,d0

	move.w	UBack_YPos0(a6),d1
	add.w	d0,d1
	cmp.w	#320,d1
	blt.s	.ok21
	sub.w	#160,d1
.ok21:
	cmp.w	#160,d1
	blt.s	.ok22
	sub.w	#160,d1
.ok22:
	sub.w	d0,d1

	move.w	UBack_XPos(a6),d2
	move.w	#Copper_UnderSplit,d3
	bsr	.insert_split

.no_second_wood:
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
;	Wasseroberflche einsortieren.

	move.w	Water_YPos(a6),d0				;Y-Pos der Wasser-oberflche.
	sub.w	Scr_Y_Level_Pos(a6),d0
	move.w	d0,Water_SpritePos(a6)
	bgt.s	.check_lower_border

	move.l	#Set_Dark_Color,UVBL_Handler(a6)
	bra.s	.no_other

.check_lower_border:
	move.l	#Set_Nothing,UVBL_Handler(a6)
	cmp.w	#224,d0
	bge.s	.no_other

	bsr	.insert_split2
	cmp.w	(a0),d0
	beq.s	.set_programm
	move.w	d0,(a0)
	move.w	#Copper_UnderWater,6(a0)		;Nur Farben umschalten!
	bra.s	.water_finished
.set_programm:
	move.w	#Copper_UnderWaterSplit,6(a0)		;Alles umschalten!
.water_finished:

	;Feststellen, ob sich direkt unterhalb des Wassersplits ein anderer Split befindet.

	move.w	(a0),d0
	addq.w	#1,d0
	cmp.w	8(a0),d0
	bne.s	.no_other

	;Den weiteren Split runterschieben oder entfernen.

	addq.w	#1,d0
	cmp.w	16(a0),d0
	bne.s	.dont_delete

	lea	8(a0),a0
	bsr	.delete_split
	bra.s	.no_other
.dont_delete:
	addq.w	#1,8(a0)

.no_other:

.no_water:

;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
;	Copperlist aufbauen

	move.l	UYPos_Buffer(a6),a0
	move.l	UCopper_Buffer(a6),a1
	addq.l	#4,a1

	;Feststellen, welche Grafik im VBlank beginnen muss

	tst.w	UWood_Height(a6)
	beq.s	.set_back
	tst.w	UWood_SplitPos(a6)
	beq.s	.set_wood
.set_back:
	move.w	UBack_YPos0(a6),(a0)+			;Background
	move.w	UBack_XPos(a6),(a0)+
	clr.w	(a0)+
	bra.s	.vlb_done

.set_wood:
	move.w	UWood_YPos(a6),d0
	sub.w	UWood_Height(a6),d0
	add.w	#48,d0
	move.w	d0,(a0)+				;Holzbalken
	move.w	UWood_XPos(a6),(a0)+
	clr.w	(a0)+

.vlb_done:
	;Alle anderen Splits eintragen.

	lea	USplit_table(a6),a2
.loop:
	cmp.w	#223,(a2)
	bhi.s	.end
	tst.w	(a2)
	beq.s	.next
	move.w	(a2)+,(a1)+				;Split-Zeile

	move.w	(a2)+,(a0)+
	move.w	(a2)+,(a0)+
	clr.w	(a1)+					;Programm
	move.w	(a2)+,(a1)+
	clr.w	(a0)+

	bra.s	.loop
.next:
	addq.l	#8,a2
	bra.s	.loop

.end:

.done:
	move.w	#$ff,(a1)+			;Copperlist abschliessen
	move.l	#Int_Nop,(a1)

;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
;	Double-Buffern

	move.l	UYPos_Buffer(a6),a0
	move.l	UYPos_Pointer(a6),UYPos_Buffer(a6)
	move.l	a0,UYPos_Pointer(a6)
	move.l	UCopper_Buffer(a6),a0
	move.l	Copper_List(a6),UCopper_Buffer(a6)
	move.l	a0,Copper_List(a6)

.only_colors:
	jsr	Show_WaterSprites

	lea	UFade_Struktur(a6),a0
	bsr	Call_Transformation2

	rts

;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
;	Split-support-routinen

.insert_split:
	tst.w	d0
	beq.s	.no_insert
	bsr	.insert_split2
	move.w	d0,(a0)
	move.w	d1,2(a0)
	move.w	d2,4(a0)
	move.w	d3,6(a0)
.no_insert:
	rts

.insert_split2:
	lea	USplit_table(a6),a0
.search_insert:
	cmp.w	(a0),d0
	beq.s	.overwrite
	blo.s	.do_insert
	addq.l	#8,a0
	bra.s	.search_insert
.do_insert:
	move.l	a5,a4
.copy_insert:
	move.l	(a4),8(a4)
	move.l	4(a4),4+8(a4)
	subq.l	#8,a4
	cmp.l	a4,a0
	ble.s	.copy_insert
	addq.l	#8,a5
.overwrite:
	rts

.delete_split:
	move.l	8(a0),(a0)
	move.l	4+8(a0),4(a0)
	addq.l	#8,a0
	cmp.l	a5,a0
	blt.s	.delete_split
	subq.l	#8,a5
	rts

;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
;	HBL-Handler

Copper_UnderSplit:
	move.l	#$40000010+$00020000,$c00004		;Vertikaler Split
	move.w	UCopper_Help(a6),$c00000
	move.l	#$40000000+$30020003,$c00004		;Horizontaler Split
	move.w	UCopper_Help+2(a6),$c00000

	move.w	#$2700,sr
	movem.l	a0/d0-d1,-(sp)

	move.l	Copper_Pointer(a6),a0
	move.w	(a0)+,d0			;In Dieser Zeile wird der Nchste Ausgelst!
	move.l	(a0)+,Int_HBlank+2(a6)
	move.l	a0,Copper_Pointer(a6)
	move.w	(a0),d1
	sub.w	d0,d1
	subq.w	#1,d1
	or.w	#$8a00,d1
	move.w	d1,$c00004

	move.l	UCopper_TabPointer(a6),a0
	move.l	(a0)+,UCopper_Help(a6)
	move.w	(a0)+,UCopper_Help+4(a6)
	move.l	a0,UCopper_TabPointer(a6)


	movem.l	(sp)+,a0/d0-d1
	rte

Copper_UnderWaterSplit:
	move.l	#$40000010+$00020000,$c00004		;Vertikaler Split
	move.w	UCopper_Help(a6),$c00000
	move.l	#$40000000+$30020003,$c00004		;Horizontaler Split
	move.w	UCopper_Help+2(a6),$c00000

Copper_UnderWater:
	move.l	Water_Color(a6),$c00004
	move.w	#$2700,sr
	movem.l	a0/d0-d1,-(sp)

	lea	$c00004,a0
	move.l	#$c0000080,HBL_Help(a6)
	move.l	#$81348f02,(a0)
	move.l	#$932a9400,(a0)
	move.l	#$95009600+($10000*(UFade_Struktur+Fade_Palette+WorkRam)>>1)&$ff0000+((UFade_Struktur+Fade_Palette+WorkRam)>>9)&$ff,(a0)
	move.w	#$9700+((UFade_Struktur+Fade_Palette+WorkRam)>>17)&$ff,(a0)
	move.w	HBL_Help(a6),(a0)
	move.w	HBL_Help+2(a6),(a0)
	move.w	#$8124,(a0)

	move.l	UCopper_TabPointer(a6),a0
	move.l	(a0)+,UCopper_Help(a6)
	move.w	(a0)+,UCopper_Help+4(a6)
	move.l	a0,UCopper_TabPointer(a6)

	move.l	#$81648700,$c00004

	move.l	Copper_Pointer(a6),a0
	move.w	(a0)+,d0			;In Dieser Zeile wird der Nchste Ausgelst!
	move.l	(a0)+,Int_HBlank+2(a6)
	move.l	a0,Copper_Pointer(a6)
	move.w	(a0),d1
	sub.w	d0,d1
	subq.w	#1,d1
	or.w	#$8a00,d1
	move.w	d1,$c00004

	movem.l	(sp)+,a0/d0-d1
	rte

Copper_InitUnder:
	move.l	Copper_List(a6),a0
	addq.l	#4,a0
	movem.l	a0-a1/d1,-(sp)

	move.l	UYPos_Pointer(a6),a0
	move.l	#$40000010+$00020000,$c00004
	move.w	(a0),d1
	move.w	(a0)+,$c00000
	move.l	#$40000000+$30020003,$c00004
	move.w	(a0)+,$c00000
	move.w	(a0)+,d0			;Color-List
	move.l	(a0)+,UCopper_Help(a6)
	move.w	(a0)+,UCopper_Help+4(a6)
	move.l	a0,UCopper_TabPointer(a6)

	move.l	UVBL_Handler(a6),a0
	jsr	(a0)

	cmp.w	#$888,UFade_Struktur+Fade_Palette+41*2(a6)
	blt.s	.switch_off

	move.w	#$8c89,$c00004
	bra.s	.exit
.switch_off:
	move.w	#$8c81,$c00004
.exit:
	movem.l	(sp)+,a0-a1/d1
	rts

Set_Dark_Color:
	lea	$c00004,a0
	move.l	#$c0000080,HBL_Help(a6)
	move.l	#$81748f02,(a0)
	move.l	#$932a9400,(a0)
	move.l	#$95009600+($10000*(UFade_Struktur+Fade_Palette+WorkRam)>>1)&$ff0000+((UFade_Struktur+Fade_Palette+WorkRam)>>9)&$ff,(a0)
	move.w	#$9700+((UFade_Struktur+Fade_Palette+WorkRam)>>17)&$ff,(a0)
	move.w	HBL_Help(a6),(a0)
	move.w	HBL_Help+2(a6),(a0)
	move.w	#$8164,(a0)

Set_Nothing:
	rts

;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
;	Parallax Initialisierung

Under_PBase	= Under_ParaVRam/32
Under_PBase2	= Under_Para2VRam/32

;-------------- Initialisiert Parallax-Playfield
Init_UnderParallax:
	move	#$8f02,$c00004

	move.w	#$2700,sr

	lea	under_parablock1(pc),a0
	move	#$c000,d0
	moveq	#19,d5
.loop2:
	jsr	SetVRamAdress

	moveq	#2,d6
.loop1:
	move.l	a0,a1
	moveq	#19,d7
.loop0:
	move	(a1)+,d1
	add.w	#Under_PBase,d1
	move.w	d1,$c00000
	dbf	d7,.loop0
	dbf	d6,.loop1

	lea	(a1),a0
	add	#$80,d0
	dbf	d5,.loop2

	lea	under_parablock2(pc),a0
	move	#$c000+20*$80,d0
	moveq	#5,d5
.loop5:
	jsr	SetVRamAdress

	move.l	a0,a1
	moveq	#39,d7
.loop3:
	move	(a1)+,d1
	add.w	#Under_PBase2,d1
	move.w	d1,$c00000
	dbf	d7,.loop3

	move.l	a0,a1

	moveq	#19,d7
.loop6:
	move	(a1)+,d1
	add.w	#Under_PBase2,d1
	move.w	d1,$c00000
	dbf	d7,.loop6

	lea	80(a0),a0
	add	#$80,d0
	dbf	d5,.loop5

	lea	under_parablock2(pc),a0
	move.w	#$c000+26*$80,d0
	moveq	#5,d5
.loop8:
	jsr	SetVRamAdress

	lea	40(a0),a1

	moveq	#19,d7
.loop9:
	move	(a1)+,d1
	add.w	#Under_PBase2,d1
	move.w	d1,$c00000
	dbf	d7,.loop9

	move.l	a0,a1
	moveq	#39,d7
.loop7:
	move	(a1)+,d1
	add.w	#Under_PBase2,d1
	move.w	d1,$c00000
	dbf	d7,.loop7

	lea	80(a0),a0
	add.w	#$80,d0
	dbf	d5,.loop8

	moveq	#0,d6
	bsr	Under_FillMacros
	moveq	#40,d6
	bsr	Under_FillMacros
	moveq	#80,d6
	bsr	Under_FillMacros

	;Create CopperLists

	lea	Under_CopperList1(a6),a0
	lea	Under_CopperList2(a6),a1
	move.l	#Copper_InitUnder,(a0)+
	move.w	#$ff,(a0)+
	move.l	#Copper_InitUnder,(a1)+
	move.w	#$ff,(a1)+
	moveq	#15-1,d7
.loop:
	move.l	#Copper_UnderSplit,(a0)+
	move.w	#$ff,(a0)+
	move.l	#Copper_UnderSplit,(a1)+

	move.w	#$ff,(a1)+
	dbf	d7,.loop
	move.l	#Int_Nop,(a0)+
	move.l	#Int_Nop,(a1)+

	move.l	#Set_Nothing,UVBL_Handler(a6)

	lea	UYPos_Table1(a6),a0
	lea	UYPos_Table2(a6),a1
	move.l	a0,UYPos_Pointer(a6)
	move.l	a1,UYPos_Buffer(a6)

	moveq	#7-1,d7
.init_ypostable:
	clr.l	(a0)+
	clr.w	(a0)+
	clr.l	(a1)+
	clr.w	(a1)+
	dbf	d7,.init_ypostable

	move.w	#128*4,Fog_XPos1(a6)
	move.w	#128*4,Fog_YPos1(a6)
	move.w	#150*4,Fog_XPos2(a6)
	move.w	#180*4,Fog_YPos2(a6)

	lea	Fog_Float(a6),a0
	move.w	#-2,(a0)+
	move.w	#6,(a0)+
	move.w	#16,(a0)+
	move.w	#-8,(a0)+
	clr.l	(a0)

	move.l	#Init_UnderParaFadeOut,Init_ParaFadeOut(a6)

	move.w	#$8b00,$c00004
	sf	Scr_SplitScroll(a6)

	move.w	#$2300,sr

	lea	UFade_Struktur(a6),a0
	lea	Black_Coltab,a1
	lea	Under_Coltab2,a2

	move.w	#42-1,d0
	bsr	Init_Transformation

	lea	Main_Rout_Table+4(a6),a0
	lea	MakeUnderPara(pc),a1
	jsr	Insert_Main_Rout

	move.l	#Under_CopperList1+WorkRam,Copper_List(a6)
	move.l	#Under_CopperList2+WorkRam,UCopper_Buffer(a6)
	move.l	#UFade_Struktur+Fade_Palette+64+WorkRam,UnderWaterColors(a6)


	rts

Under_FillMacros:
	;Macros einfgen!
	move.w	#$8f02,$c00004

	lea	Scr_Macros(a6),a1
	lea	Under_MacroParaTable(pc),a0
.loop:
	move.w	(a0)+,d0
	beq.s	.end
	add.w	d6,d0
	move.w	(a0)+,d7
	jsr	SetVRamAdress
	move.l	(a1,d7.w),d1
	and.l	#$0fff0fff,d1
	or.l	#$e000e000,d1
	move.l	d1,$c00000
	add.w	#$80,d0
	jsr	SetVRamAdress
	move.l	4(a1,d7.w),d1
	and.l	#$0fff0fff,d1
	or.l	#$e000e000,d1
	move.l	d1,$c00000
	bra	.loop
.end:
	rts

Under_MacroParaTable:
	dc.w	$c000+4*3+$100*0
	dc.w	8*80
	dc.w	$c000+4*4+$100*0
	dc.w	8*121
	dc.w	$c000+4*5+$100*0
	dc.w	8*62
	dc.w	$c000+4*9+$100*0
	dc.w	8*120

	dc.w	$c000+4*3+$100*1
	dc.w	8*100
	dc.w	$c000+4*4+$100*1
	dc.w	8*141
	dc.w	$c000+4*9+$100*1
	dc.w	8*140

	dc.w	$c000+4*8+$100*3
	dc.w	8*62

	dc.w	$c000+4*0+$100*5
	dc.w	8*81
	dc.w	$c000+4*1+$100*5
	dc.w	8*82
	dc.w	$c000+4*2+$100*5
	dc.w	8*60
	dc.w	$c000+4*3+$100*5
	dc.w	8*61
	dc.w	$c000+4*8+$100*5
	dc.w	8*62
	dc.w	$c000+4*9+$100*5
	dc.w	8*80

	dc.w	$c000+4*0+$100*6
	dc.w	8*101
	dc.w	$c000+4*1+$100*6
	dc.w	8*102
	dc.w	$c000+4*9+$100*6
	dc.w	8*100

	dc.w	$c000+4*1+$100*7
	dc.w	8*62

	dc.w	$c000+4*3+$100*8
	dc.w	8*62
	dc.w	$c000+4*9+$100*8
	dc.w	8*62

	dc.w	$c000+4*3+$100*9
	dc.w	8*60
	dc.w	$c000+4*4+$100*9
	dc.w	8*61

	dc.w	0

Init_UnderParaFadeOut:
	lea	UFade_Struktur(a6),a0
	lea	Under_Coltab2,a1
	lea	Black_Coltab,a2

	move.w	#64-1,d0
	jmp	Init_Transformation

Under_Coltab2:	;Final
		dc.w	$0000,$0E6A,$0c68,$0846,$0604,$00A8,$0086,$0064
		dc.w	$0042,$0C6C,$0C0C,$0808,$0404,$000C,$000A,$0008

		dc.w	$0EA0,$084C,$080A,$0608,$0206,$0606,$0404,$0828
		dc.w	$00CC,$0C88,$0C64,$0C44,$0824,$0EAE,$0C6C,$0A4A

		dc.w	$0000,$0C88,$0ECC,$0846,$000E,$000C,$000A,$0006	;Mr-Nutz
		dc.w	$0000,$0EEE

Show_FogSprites:
	move.w	Sig_LinkData(a6),d4
	move.l	Sig_VRam_Pointer(a6),a4

	;Layer 1
	move.w	Fog_XPos1(a6),d0
	move.w	Fog_YPos1(a6),d1
	lea	Fog_Float(a6),a1
	move.w	Scr_X_Real_Speed(a6),d2
	asl.w	#2,d2
	sub.w	d2,d0
	move.w	Scr_Y_Real_Speed(a6),d2
	asl.w	#2,d2
	sub.w	d2,d1

	bsr	.do_float
	add.w	d2,d0
	add.w	d3,d1
	bsr	.check_boundaries
	move.w	d0,Fog_XPos1(a6)
	move.w	d1,Fog_YPos1(a6)

	lea	Fog_OffsetList1(pc),a0
	bsr	.show_layer

	;Layer 2
	move.w	Fog_XPos2(a6),d0
	move.w	Fog_YPos2(a6),d1
	move.w	Scr_X_Real_Speed(a6),d2
	asl.w	#3,d2
	sub.w	d2,d0
	move.w	Scr_Y_Real_Speed(a6),d2
	asl.w	#3,d2
	sub.w	d2,d1

	bsr	.do_float
	add.w	d2,d0
	add.w	d2,d0
	add.w	d3,d1
	add.w	d3,d1
	bsr	.check_boundaries
	move.w	d0,Fog_XPos2(a6)
	move.w	d1,Fog_YPos2(a6)

	lea	Fog_OffsetList2(pc),a0
	bsr	.show_layer

	move.l	a4,Sig_VRam_Pointer(a6)
	move.w	d4,Sig_LinkData(a6)

	rts


.check_boundaries:
	cmp.w	#(320+128)*16,d0
	blt.s	.xmov_ok1
	sub.w	#351*16,d0
.xmov_ok1:
	cmp.w	#96*16,d0
	bgt.s	.xmov_ok2
	add.w	#351*16,d0
.xmov_ok2:

	cmp.w	#(224+128)*16,d1
	blt.s	.ymov_ok1
	sub.w	#255*16,d1
.ymov_ok1:
	cmp.w	#96*16,d1
	bgt.s	.ymov_ok2
	add.w	#255*16,d1
.ymov_ok2:
	rts

.show_layer:
	lsr.w	#4,d0
	lsr.w	#4,d1
	moveq	#8-1,d7
.fogloop:
	add.w	(a0)+,d0
	add.w	(a0)+,d1

	cmp.w	#320+128,d0
	blt.s	.x_ok1
	sub.w	#351,d0
.x_ok1:
	cmp.w	#96,d0
	bgt.s	.x_ok2
	add.w	#351,d0
.x_ok2:
	cmp.w	#224+128,d1
	blt.s	.y_ok1
	sub.w	#255,d1
.y_ok1:
	cmp.w	#96,d1
	bgt.s	.y_ok2
	add.w	#255,d1
.y_ok2:

	move.w	d1,(a4)+
	move.b	#$0f,(a4)+
	move.b	d4,(a4)+
	move.w	#$e000+$1c0+Under_EnemyVRam/32,(a4)+
	move.w	d0,(a4)+
	addq.w	#1,d4

	dbf	d7,.fogloop
	rts


.do_float:
	subq.b	#1,Fog_global_verz(a6)
	bpl.s	.no_float_adjust
	move.b	#5,Fog_global_verz(a6)

	subq.b	#1,Fog_next_anim(a6)
	bpl.s	.no_new_anim
	move.b	#127,Fog_next_anim(a6)

	addq.w	#1,Fog_Pointer(a6)
	move.w	Fog_Pointer(a6),d7
	and.w	#7,d7
	add.w	d7,d7
	lea	Fog_Speed_Table(pc),a2
	move.w	(a2,d7.w),4(a1)
	move.w	16(a2,d7.w),6(a1)

.no_new_anim:

	;Floating geschwindigkeit angleichen
	move.w	(a1),d2		;Ist Geschwindigkeit
	cmp.w	4(a1),d2	;Soll Geschwindigkeit
	beq.s	.x_is_ok
	blt.s	.x_add
	subq.w	#1,(a1)
	bra.s	.x_is_ok
.x_add:
	addq.w	#1,(a1)
.x_is_ok:
	move.w	2(a1),d2	;Ist Geschwindigkeit
	cmp.w	6(a1),d2	;Soll Geschwindigkeit
	beq.s	.y_is_ok
	blt.s	.y_add
	subq.w	#1,2(a1)
	bra.s	.y_is_ok
.y_add:
	addq.w	#1,2(a1)
.y_is_ok:
.no_float_adjust:
	move.w	(a1),d2
	move.w	2(a1),d3

	rts


Fog_Speed_Table:	dc.w	-8,4,6,-3,15,4,-14,10
			dc.w	3,6,-2,-1,7,-3,5,-6


Fog_OffsetList1:
	dc.w	0,0
	dc.w	50,32
	dc.w	30,32
	dc.w	-65,32
	dc.w	173,32
	dc.w	56,32
	dc.w	-72,32
	dc.w	-81,32
	dc.w	125,32
	dc.w	47,32

Fog_OffsetList2:
	dc.w	30,32
	dc.w	173,32
	dc.w	-72,32
	dc.w	125,32
	dc.w	-65,32
	dc.w	50,32
	dc.w	-81,32
	dc.w	56,32

under_parablock1:	incbin	work:sega/sources/mr_nutz/binary/under/under_para1.map
under_parablock2:	incbin	work:sega/sources/mr_nutz/binary/under/under_para2.map

	ENDC
*NEONNEONNEONNEONNEONNEON*
